const arr = [1, 2, 3]

// Array.prototype.max = function() {
//     // 原型对象 里面的this 指向实例对象
//     return Math.max(...this)
// }

// Array.prototype.sum = function() {
//     return this.reduce((a, b) => a + b, 0)
// }

// console.log(arr.max())
// console.log(arr.sum())

// 实例对象 new 构造函数
// 静态对象 构造函数
// 原型对象 构造函数.prototype
// 对象原型 实例对象.__proto__

// 同时 绑定多个方法
// Array.prototype = {
//     constructor: Array,
//     max() {
//         return Math.max(...this)
//     },
//     sum() {
//         return this.reduce((a, b) => a + b, 0)
//     }
// }

// 对象原型 指向 原型对象
// function Person(name, age) {
//     this.name = name
//     this.age = age
// }

// const p1 = new Person('张三', 18)

// // 对象原型 指向 原型对象
// console.log(p1.__proto__ === Person.prototype); //true
// // 对象原型中的constructor 指向 构造函数
// console.log(p1.__proto__.constructor === Person); // true


// // 原型继承
// const Person = {
//     eays: 2,
//     head: 1
// }

// function Woman() {}

// Woman.prototype = Person

// Woman.prototype.constructor = Woman

// Woman.prototype.sing = function() {
//     console.log('唱歌');
// }

// console.log(new Woman().eays); // 2

// console.log(Person);


// 原型继承 构造函数特征： 结构一样， 内容一样， 对象不一样
// function Person() {
//     this.eyes = 2,
//     this.head = 1
// }

// console.log(new Person() === new Person()); // false 每次new 出来的 对象都是 不同的实例对象

// function Woman() {}

// function Man() {}

// Woman.prototype = new Person()
// Woman.prototype.constructor = Woman

// Man.prototype = new Person()
// Man.prototype.constructor = Man


// 原型链
function Person() {}

// 原型对象的  对象原型 指向 Object.prototype(原型对象)
console.log(Person.prototype.__proto__ === Object.prototype); // true
console.log(Object.prototype.__proto__); // null


